package com.tedu.mybatis.mapper;

import com.tedu.mybatis.pojo.*;
import jdk.nashorn.internal.objects.annotations.Setter;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface WeiboMapper {
    //@Insert("INSERT INTO weibo (user_id,content,created) VALUES (#{userId},#{content},#{created})")
    int insertWeibo(Weibo weibo);

    //@Delete("DELETE FROM weibo WHERE id = #{id}")
    int deleteById(Integer id);

    //@Update("UPDATE weibo SET content=#{content},created=#{created},user_id=#{userId} " +
     //       "WHERE id=#{id}")
    int updateWeibo(Weibo weibo);
    /*
        SELECT id,content,created,user_id
        FROM weibo
        WHERE id=?

        自己写JDBC时,我们将查询出来的对象ResultSet中的记录存入到一个Weibo对象上
        因此我们要实例化Weibo对象
        Weibo weibo = new Weibo();

        然后将结果集中这条记录各个字段的值设置到Weibo对象对应的属性上
        weibo.setId(rs.getInt("id"));
        weibo.setContent(rs.getString("content"))
        ...
        最终将Weibo对象返回

     *  在MyBatis中，我们编写SELECT语句时，最终框架会自动将结果集的记录转换为一个
     *  实体对象(这里就是Blog对象)
     *  框架将结果集一条记录设置到Blog对象对应属性上的规则为:
     *  结果集的字段名应当与Blog类中属性名一样的会自动将值设置完毕
     *  如果结果集中字段名与Blog类中属性名不一致时，可以在SELECT子句中为该字段添加别名
     *  让别名与Blog类中的属性名一致即可。
     *
     *  例如:
     *  blog表中有一个字段:user_id
     *  而Blog类中该属性为:userId
     *  因此为了顺利的让框架将结果集中user_id的值设置到userId属性上，我们需要将SELECT语句写为:
     *  SELECT id,content,created,user_id userId ...
     *            ^^^^^^^                 ^^^^^^
     *            |||||||              别名与属性名一致即可
     *    这些字段本身与属性名一致会自动绑定

     */

    //@Select("SELECT id,user_id userId,content,created FROM weibo " +
    //        "WHERE id = #{id}")
    Weibo selectById(Integer id);

    //@Select("SELECT id,user_id userId,content,created FROM weibo ")
    List<Weibo> selectAll();

    //@Select("SELECT content,created FROM weibo " +
    //        "WHERE id = #{id}")
    WeiboVO1 selectWeiboVO1ById(Integer id);

    //@Select("SELECT user_id userId,content FROM weibo ")
    List<WeiboVO2> selectWeiboVO2All();


    int dynamicUpdateById(Weibo weibo);

    int dynamicDeleteById(Integer[] ids);

    int dynamicDeleteById2(List<Integer> ids);

    //测试使用映射表将结果集对应当返回的WeiboVO3对象中，学习映射的使用(WeiboMapper.xml中配置)
    WeiboVO3 selectResultMap(Integer id);

    WeiboVO4 selectWeiboAndCommentById(Integer id);

    int countWeibo();

}
